{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "iSNx_cpHLk4U"
      },
      "source": [
        "Copyright 2024 Google. All Rights Reserved.\n",
        "\n",
        "Licensed under the Apache License, Version 2.0 (the \"License\");\n",
        "you may not use this file except in compliance with the License.\n",
        "You may obtain a copy of the License at\n",
        "\n",
        "     http://www.apache.org/licenses/LICENSE-2.0\n",
        "\n",
        "Unless required by applicable law or agreed to in writing, software\n",
        "distributed under the License is distributed on an \"AS IS\" BASIS,\n",
        "WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n",
        "See the License for the specific language governing permissions and\n",
        "limitations under the License."
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "id": "V3MXGeuiJKm2"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import pandas as pd"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "executionInfo": {
          "elapsed": 15,
          "status": "ok",
          "timestamp": 1707225325227,
          "user": {
            "displayName": "Martin Bruse",
            "userId": "11653897382912197853"
          },
          "user_tz": -60
        },
        "id": "NS3KzmatoC0K",
        "outputId": "1cb42bde-9087-4cdf-dd4a-2c7a28eafa95"
      },
      "outputs": [
        {
          "data": {
            "application/vnd.google.colaboratory.intrinsic+json": {
              "summary": "{\n  \"name\": \"dataframe\",\n  \"rows\": 31,\n  \"fields\": [\n    {\n      \"column\": \"method\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"samples\": [\n          \"mozjpeg-q80-yuv422\",\n          \"jpegli-q95-yuv444\",\n          \"libjpeg-turbo-q90-yuv444\"\n        ],\n        \"num_unique_values\": 31,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"elo\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 357.0546814762691,\n        \"min\": 1417.7186,\n        \"max\": 2634.0227,\n        \"samples\": [\n          1958.4712,\n          2634.0227,\n          2392.5342\n        ],\n        \"num_unique_values\": 31,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"p99Low\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 353.3443880977271,\n        \"min\": 1359.5063,\n        \"max\": 2568.278,\n        \"samples\": [\n          1916.8787,\n          2568.278,\n          2341.0535\n        ],\n        \"num_unique_values\": 31,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"p99Hi\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 360.8547605753182,\n        \"min\": 1475.9309,\n        \"max\": 2699.7676,\n        \"samples\": [\n          2000.0637,\n          2699.7676,\n          2444.015\n        ],\n        \"num_unique_values\": 31,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"bpp\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0.7739578875241327,\n        \"min\": 0.8748113,\n        \"max\": 3.77433,\n        \"samples\": [\n          1.3579394,\n          2.7829142,\n          2.6226315\n        ],\n        \"num_unique_values\": 31,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"label\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"samples\": [\n          \"jpegli-420\",\n          \"mozjpeg\",\n          \"jpegli\"\n        ],\n        \"num_unique_values\": 4,\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}",
              "type": "dataframe",
              "variable_name": "dataframe"
            },
            "text/html": [
              "\n",
              "  \u003cdiv id=\"df-bf491ffd-554f-45da-b036-38aa5371007f\" class=\"colab-df-container\"\u003e\n",
              "    \u003cdiv\u003e\n",
              "\u003cstyle scoped\u003e\n",
              "    .dataframe tbody tr th:only-of-type {\n",
              "        vertical-align: middle;\n",
              "    }\n",
              "\n",
              "    .dataframe tbody tr th {\n",
              "        vertical-align: top;\n",
              "    }\n",
              "\n",
              "    .dataframe thead th {\n",
              "        text-align: right;\n",
              "    }\n",
              "\u003c/style\u003e\n",
              "\u003ctable border=\"1\" class=\"dataframe\"\u003e\n",
              "  \u003cthead\u003e\n",
              "    \u003ctr style=\"text-align: right;\"\u003e\n",
              "      \u003cth\u003e\u003c/th\u003e\n",
              "      \u003cth\u003emethod\u003c/th\u003e\n",
              "      \u003cth\u003eelo\u003c/th\u003e\n",
              "      \u003cth\u003ep99Low\u003c/th\u003e\n",
              "      \u003cth\u003ep99Hi\u003c/th\u003e\n",
              "      \u003cth\u003ebpp\u003c/th\u003e\n",
              "      \u003cth\u003elabel\u003c/th\u003e\n",
              "    \u003c/tr\u003e\n",
              "  \u003c/thead\u003e\n",
              "  \u003ctbody\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e0\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q55-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e1616.2178\u003c/td\u003e\n",
              "      \u003ctd\u003e1570.1244\u003c/td\u003e\n",
              "      \u003ctd\u003e1662.3113\u003c/td\u003e\n",
              "      \u003ctd\u003e0.896926\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e1\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q60-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e1656.4395\u003c/td\u003e\n",
              "      \u003ctd\u003e1611.1019\u003c/td\u003e\n",
              "      \u003ctd\u003e1701.7771\u003c/td\u003e\n",
              "      \u003ctd\u003e0.963380\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e2\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q65-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1600.8348\u003c/td\u003e\n",
              "      \u003ctd\u003e1554.3654\u003c/td\u003e\n",
              "      \u003ctd\u003e1647.3044\u003c/td\u003e\n",
              "      \u003ctd\u003e0.874811\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli-420\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e3\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q65-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e1738.0724\u003c/td\u003e\n",
              "      \u003ctd\u003e1695.7542\u003c/td\u003e\n",
              "      \u003ctd\u003e1780.3906\u003c/td\u003e\n",
              "      \u003ctd\u003e1.029448\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e4\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q70-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1692.4553\u003c/td\u003e\n",
              "      \u003ctd\u003e1648.4811\u003c/td\u003e\n",
              "      \u003ctd\u003e1736.4296\u003c/td\u003e\n",
              "      \u003ctd\u003e0.953669\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli-420\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e5\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q70-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e1864.5178\u003c/td\u003e\n",
              "      \u003ctd\u003e1824.3069\u003c/td\u003e\n",
              "      \u003ctd\u003e1904.7288\u003c/td\u003e\n",
              "      \u003ctd\u003e1.123597\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e6\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q75-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1823.9264\u003c/td\u003e\n",
              "      \u003ctd\u003e1782.0206\u003c/td\u003e\n",
              "      \u003ctd\u003e1865.8322\u003c/td\u003e\n",
              "      \u003ctd\u003e1.051037\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli-420\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e7\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q75-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2022.0585\u003c/td\u003e\n",
              "      \u003ctd\u003e1980.5918\u003c/td\u003e\n",
              "      \u003ctd\u003e2063.5254\u003c/td\u003e\n",
              "      \u003ctd\u003e1.227468\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e8\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q80-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1980.5387\u003c/td\u003e\n",
              "      \u003ctd\u003e1935.3760\u003c/td\u003e\n",
              "      \u003ctd\u003e2025.7014\u003c/td\u003e\n",
              "      \u003ctd\u003e1.176039\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli-420\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e9\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q80-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2139.4082\u003c/td\u003e\n",
              "      \u003ctd\u003e2096.1480\u003c/td\u003e\n",
              "      \u003ctd\u003e2182.6687\u003c/td\u003e\n",
              "      \u003ctd\u003e1.374517\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e10\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q85-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e2135.3962\u003c/td\u003e\n",
              "      \u003ctd\u003e2088.1436\u003c/td\u003e\n",
              "      \u003ctd\u003e2182.6487\u003c/td\u003e\n",
              "      \u003ctd\u003e1.361384\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli-420\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e11\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q85-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2293.2693\u003c/td\u003e\n",
              "      \u003ctd\u003e2247.1530\u003c/td\u003e\n",
              "      \u003ctd\u003e2339.3857\u003c/td\u003e\n",
              "      \u003ctd\u003e1.591872\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e12\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q90-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e2296.9397\u003c/td\u003e\n",
              "      \u003ctd\u003e2247.5278\u003c/td\u003e\n",
              "      \u003ctd\u003e2346.3516\u003c/td\u003e\n",
              "      \u003ctd\u003e1.698086\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli-420\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e13\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q90-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2440.6377\u003c/td\u003e\n",
              "      \u003ctd\u003e2388.3870\u003c/td\u003e\n",
              "      \u003ctd\u003e2492.8887\u003c/td\u003e\n",
              "      \u003ctd\u003e1.971755\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e14\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q95-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e2481.9868\u003c/td\u003e\n",
              "      \u003ctd\u003e2425.2605\u003c/td\u003e\n",
              "      \u003ctd\u003e2538.7131\u003c/td\u003e\n",
              "      \u003ctd\u003e2.409262\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli-420\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e15\u003c/th\u003e\n",
              "      \u003ctd\u003ejpegli-q95-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2634.0227\u003c/td\u003e\n",
              "      \u003ctd\u003e2568.2780\u003c/td\u003e\n",
              "      \u003ctd\u003e2699.7676\u003c/td\u003e\n",
              "      \u003ctd\u003e2.782914\u003c/td\u003e\n",
              "      \u003ctd\u003ejpegli\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e16\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q55-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1417.7186\u003c/td\u003e\n",
              "      \u003ctd\u003e1359.5063\u003c/td\u003e\n",
              "      \u003ctd\u003e1475.9309\u003c/td\u003e\n",
              "      \u003ctd\u003e0.890062\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e17\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q60-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1522.5587\u003c/td\u003e\n",
              "      \u003ctd\u003e1472.4467\u003c/td\u003e\n",
              "      \u003ctd\u003e1572.6708\u003c/td\u003e\n",
              "      \u003ctd\u003e0.954096\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e18\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q65-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1572.9736\u003c/td\u003e\n",
              "      \u003ctd\u003e1525.9553\u003c/td\u003e\n",
              "      \u003ctd\u003e1619.9918\u003c/td\u003e\n",
              "      \u003ctd\u003e1.033683\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e19\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q70-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1685.1305\u003c/td\u003e\n",
              "      \u003ctd\u003e1642.5930\u003c/td\u003e\n",
              "      \u003ctd\u003e1727.6680\u003c/td\u003e\n",
              "      \u003ctd\u003e1.129677\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e20\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q75-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1757.0505\u003c/td\u003e\n",
              "      \u003ctd\u003e1714.4518\u003c/td\u003e\n",
              "      \u003ctd\u003e1799.6492\u003c/td\u003e\n",
              "      \u003ctd\u003e1.239587\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e21\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q80-yuv422\u003c/td\u003e\n",
              "      \u003ctd\u003e1989.6469\u003c/td\u003e\n",
              "      \u003ctd\u003e1946.9990\u003c/td\u003e\n",
              "      \u003ctd\u003e2032.2948\u003c/td\u003e\n",
              "      \u003ctd\u003e1.540141\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e22\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q85-yuv422\u003c/td\u003e\n",
              "      \u003ctd\u003e2150.5596\u003c/td\u003e\n",
              "      \u003ctd\u003e2107.5012\u003c/td\u003e\n",
              "      \u003ctd\u003e2193.6177\u003c/td\u003e\n",
              "      \u003ctd\u003e1.804783\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e23\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q90-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2392.5342\u003c/td\u003e\n",
              "      \u003ctd\u003e2341.0535\u003c/td\u003e\n",
              "      \u003ctd\u003e2444.0150\u003c/td\u003e\n",
              "      \u003ctd\u003e2.622631\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e24\u003c/th\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo-q95-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2608.0166\u003c/td\u003e\n",
              "      \u003ctd\u003e2546.6313\u003c/td\u003e\n",
              "      \u003ctd\u003e2669.4019\u003c/td\u003e\n",
              "      \u003ctd\u003e3.774330\u003c/td\u003e\n",
              "      \u003ctd\u003elibjpeg-turbo\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e25\u003c/th\u003e\n",
              "      \u003ctd\u003emozjpeg-q70-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1662.1260\u003c/td\u003e\n",
              "      \u003ctd\u003e1619.2194\u003c/td\u003e\n",
              "      \u003ctd\u003e1705.0326\u003c/td\u003e\n",
              "      \u003ctd\u003e0.914854\u003c/td\u003e\n",
              "      \u003ctd\u003emozjpeg\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e26\u003c/th\u003e\n",
              "      \u003ctd\u003emozjpeg-q75-yuv420\u003c/td\u003e\n",
              "      \u003ctd\u003e1760.7078\u003c/td\u003e\n",
              "      \u003ctd\u003e1719.5176\u003c/td\u003e\n",
              "      \u003ctd\u003e1801.8980\u003c/td\u003e\n",
              "      \u003ctd\u003e1.024720\u003c/td\u003e\n",
              "      \u003ctd\u003emozjpeg\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e27\u003c/th\u003e\n",
              "      \u003ctd\u003emozjpeg-q80-yuv422\u003c/td\u003e\n",
              "      \u003ctd\u003e1958.4712\u003c/td\u003e\n",
              "      \u003ctd\u003e1916.8787\u003c/td\u003e\n",
              "      \u003ctd\u003e2000.0637\u003c/td\u003e\n",
              "      \u003ctd\u003e1.357939\u003c/td\u003e\n",
              "      \u003ctd\u003emozjpeg\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e28\u003c/th\u003e\n",
              "      \u003ctd\u003emozjpeg-q85-yuv422\u003c/td\u003e\n",
              "      \u003ctd\u003e2136.8660\u003c/td\u003e\n",
              "      \u003ctd\u003e2093.9138\u003c/td\u003e\n",
              "      \u003ctd\u003e2179.8180\u003c/td\u003e\n",
              "      \u003ctd\u003e1.590558\u003c/td\u003e\n",
              "      \u003ctd\u003emozjpeg\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e29\u003c/th\u003e\n",
              "      \u003ctd\u003emozjpeg-q90-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2360.3062\u003c/td\u003e\n",
              "      \u003ctd\u003e2312.1338\u003c/td\u003e\n",
              "      \u003ctd\u003e2408.4785\u003c/td\u003e\n",
              "      \u003ctd\u003e2.495490\u003c/td\u003e\n",
              "      \u003ctd\u003emozjpeg\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "    \u003ctr\u003e\n",
              "      \u003cth\u003e30\u003c/th\u003e\n",
              "      \u003ctd\u003emozjpeg-q95-yuv444\u003c/td\u003e\n",
              "      \u003ctd\u003e2608.6120\u003c/td\u003e\n",
              "      \u003ctd\u003e2546.6934\u003c/td\u003e\n",
              "      \u003ctd\u003e2670.5308\u003c/td\u003e\n",
              "      \u003ctd\u003e3.502980\u003c/td\u003e\n",
              "      \u003ctd\u003emozjpeg\u003c/td\u003e\n",
              "    \u003c/tr\u003e\n",
              "  \u003c/tbody\u003e\n",
              "\u003c/table\u003e\n",
              "\u003c/div\u003e\n",
              "    \u003cdiv class=\"colab-df-buttons\"\u003e\n",
              "\n",
              "  \u003cdiv class=\"colab-df-container\"\u003e\n",
              "    \u003cbutton class=\"colab-df-convert\" onclick=\"convertToInteractive('df-bf491ffd-554f-45da-b036-38aa5371007f')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\"\u003e\n",
              "\n",
              "  \u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\"\u003e\n",
              "    \u003cpath d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/\u003e\n",
              "  \u003c/svg\u003e\n",
              "    \u003c/button\u003e\n",
              "\n",
              "  \u003cstyle\u003e\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  \u003c/style\u003e\n",
              "\n",
              "    \u003cscript\u003e\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-bf491ffd-554f-45da-b036-38aa5371007f button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-bf491ffd-554f-45da-b036-38aa5371007f');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '\u003ca target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb\u003edata table notebook\u003c/a\u003e'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    \u003c/script\u003e\n",
              "  \u003c/div\u003e\n",
              "\n",
              "\n",
              "\u003cdiv id=\"df-8a9791fc-b9df-4610-8642-586a6e5bc7a7\"\u003e\n",
              "  \u003cbutton class=\"colab-df-quickchart\" onclick=\"quickchart('df-8a9791fc-b9df-4610-8642-586a6e5bc7a7')\"\n",
              "            title=\"Suggest charts\"\n",
              "            style=\"display:none;\"\u003e\n",
              "\n",
              "\u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\"\u003e\n",
              "    \u003cg\u003e\n",
              "        \u003cpath d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/\u003e\n",
              "    \u003c/g\u003e\n",
              "\u003c/svg\u003e\n",
              "  \u003c/button\u003e\n",
              "\n",
              "\u003cstyle\u003e\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "\u003c/style\u003e\n",
              "\n",
              "  \u003cscript\u003e\n",
              "    async function quickchart(key) {\n",
              "      const quickchartButtonEl =\n",
              "        document.querySelector('#' + key + ' button');\n",
              "      quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "      quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "      try {\n",
              "        const charts = await google.colab.kernel.invokeFunction(\n",
              "            'suggestCharts', [key], {});\n",
              "      } catch (error) {\n",
              "        console.error('Error during call to suggestCharts:', error);\n",
              "      }\n",
              "      quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "      quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "    }\n",
              "    (() =\u003e {\n",
              "      let quickchartButtonEl =\n",
              "        document.querySelector('#df-8a9791fc-b9df-4610-8642-586a6e5bc7a7 button');\n",
              "      quickchartButtonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "    })();\n",
              "  \u003c/script\u003e\n",
              "\u003c/div\u003e\n",
              "\n",
              "  \u003cdiv id=\"id_e94f5bb9-d5ca-4407-b2f1-4d751d982b8a\"\u003e\n",
              "    \u003cstyle\u003e\n",
              "      .colab-df-generate {\n",
              "        background-color: #E8F0FE;\n",
              "        border: none;\n",
              "        border-radius: 50%;\n",
              "        cursor: pointer;\n",
              "        display: none;\n",
              "        fill: #1967D2;\n",
              "        height: 32px;\n",
              "        padding: 0 0 0 0;\n",
              "        width: 32px;\n",
              "      }\n",
              "\n",
              "      .colab-df-generate:hover {\n",
              "        background-color: #E2EBFA;\n",
              "        box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "        fill: #174EA6;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate {\n",
              "        background-color: #3B4455;\n",
              "        fill: #D2E3FC;\n",
              "      }\n",
              "\n",
              "      [theme=dark] .colab-df-generate:hover {\n",
              "        background-color: #434B5C;\n",
              "        box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "        filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "        fill: #FFFFFF;\n",
              "      }\n",
              "    \u003c/style\u003e\n",
              "    \u003cbutton class=\"colab-df-generate\" onclick=\"generateWithVariable('dataframe')\"\n",
              "            title=\"Generate code using this dataframe.\"\n",
              "            style=\"display:none;\"\u003e\n",
              "\n",
              "  \u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "       width=\"24px\"\u003e\n",
              "    \u003cpath d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/\u003e\n",
              "  \u003c/svg\u003e\n",
              "    \u003c/button\u003e\n",
              "    \u003cscript\u003e\n",
              "      (() =\u003e {\n",
              "      const buttonEl =\n",
              "        document.querySelector('#id_e94f5bb9-d5ca-4407-b2f1-4d751d982b8a button.colab-df-generate');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      buttonEl.onclick = () =\u003e {\n",
              "        google.colab.notebook.generateWithVariable('dataframe');\n",
              "      }\n",
              "      })();\n",
              "    \u003c/script\u003e\n",
              "  \u003c/div\u003e\n",
              "\n",
              "    \u003c/div\u003e\n",
              "  \u003c/div\u003e\n"
            ],
            "text/plain": [
              "                      method        elo     p99Low      p99Hi       bpp  \\\n",
              "0          jpegli-q55-yuv444  1616.2178  1570.1244  1662.3113  0.896926   \n",
              "1          jpegli-q60-yuv444  1656.4395  1611.1019  1701.7771  0.963380   \n",
              "2          jpegli-q65-yuv420  1600.8348  1554.3654  1647.3044  0.874811   \n",
              "3          jpegli-q65-yuv444  1738.0724  1695.7542  1780.3906  1.029448   \n",
              "4          jpegli-q70-yuv420  1692.4553  1648.4811  1736.4296  0.953669   \n",
              "5          jpegli-q70-yuv444  1864.5178  1824.3069  1904.7288  1.123597   \n",
              "6          jpegli-q75-yuv420  1823.9264  1782.0206  1865.8322  1.051037   \n",
              "7          jpegli-q75-yuv444  2022.0585  1980.5918  2063.5254  1.227468   \n",
              "8          jpegli-q80-yuv420  1980.5387  1935.3760  2025.7014  1.176039   \n",
              "9          jpegli-q80-yuv444  2139.4082  2096.1480  2182.6687  1.374517   \n",
              "10         jpegli-q85-yuv420  2135.3962  2088.1436  2182.6487  1.361384   \n",
              "11         jpegli-q85-yuv444  2293.2693  2247.1530  2339.3857  1.591872   \n",
              "12         jpegli-q90-yuv420  2296.9397  2247.5278  2346.3516  1.698086   \n",
              "13         jpegli-q90-yuv444  2440.6377  2388.3870  2492.8887  1.971755   \n",
              "14         jpegli-q95-yuv420  2481.9868  2425.2605  2538.7131  2.409262   \n",
              "15         jpegli-q95-yuv444  2634.0227  2568.2780  2699.7676  2.782914   \n",
              "16  libjpeg-turbo-q55-yuv420  1417.7186  1359.5063  1475.9309  0.890062   \n",
              "17  libjpeg-turbo-q60-yuv420  1522.5587  1472.4467  1572.6708  0.954096   \n",
              "18  libjpeg-turbo-q65-yuv420  1572.9736  1525.9553  1619.9918  1.033683   \n",
              "19  libjpeg-turbo-q70-yuv420  1685.1305  1642.5930  1727.6680  1.129677   \n",
              "20  libjpeg-turbo-q75-yuv420  1757.0505  1714.4518  1799.6492  1.239587   \n",
              "21  libjpeg-turbo-q80-yuv422  1989.6469  1946.9990  2032.2948  1.540141   \n",
              "22  libjpeg-turbo-q85-yuv422  2150.5596  2107.5012  2193.6177  1.804783   \n",
              "23  libjpeg-turbo-q90-yuv444  2392.5342  2341.0535  2444.0150  2.622631   \n",
              "24  libjpeg-turbo-q95-yuv444  2608.0166  2546.6313  2669.4019  3.774330   \n",
              "25        mozjpeg-q70-yuv420  1662.1260  1619.2194  1705.0326  0.914854   \n",
              "26        mozjpeg-q75-yuv420  1760.7078  1719.5176  1801.8980  1.024720   \n",
              "27        mozjpeg-q80-yuv422  1958.4712  1916.8787  2000.0637  1.357939   \n",
              "28        mozjpeg-q85-yuv422  2136.8660  2093.9138  2179.8180  1.590558   \n",
              "29        mozjpeg-q90-yuv444  2360.3062  2312.1338  2408.4785  2.495490   \n",
              "30        mozjpeg-q95-yuv444  2608.6120  2546.6934  2670.5308  3.502980   \n",
              "\n",
              "            label  \n",
              "0          jpegli  \n",
              "1          jpegli  \n",
              "2      jpegli-420  \n",
              "3          jpegli  \n",
              "4      jpegli-420  \n",
              "5          jpegli  \n",
              "6      jpegli-420  \n",
              "7          jpegli  \n",
              "8      jpegli-420  \n",
              "9          jpegli  \n",
              "10     jpegli-420  \n",
              "11         jpegli  \n",
              "12     jpegli-420  \n",
              "13         jpegli  \n",
              "14     jpegli-420  \n",
              "15         jpegli  \n",
              "16  libjpeg-turbo  \n",
              "17  libjpeg-turbo  \n",
              "18  libjpeg-turbo  \n",
              "19  libjpeg-turbo  \n",
              "20  libjpeg-turbo  \n",
              "21  libjpeg-turbo  \n",
              "22  libjpeg-turbo  \n",
              "23  libjpeg-turbo  \n",
              "24  libjpeg-turbo  \n",
              "25        mozjpeg  \n",
              "26        mozjpeg  \n",
              "27        mozjpeg  \n",
              "28        mozjpeg  \n",
              "29        mozjpeg  \n",
              "30        mozjpeg  "
            ]
          },
          "execution_count": 29,
          "metadata": {},
          "output_type": "execute_result"
        }
      ],
      "source": [
        "dataframe = pd.read_csv('elo.csv')\n",
        "dataframe"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 11,
          "status": "ok",
          "timestamp": 1707225325228,
          "user": {
            "displayName": "Martin Bruse",
            "userId": "11653897382912197853"
          },
          "user_tz": -60
        },
        "id": "7of7RihWJjil",
        "outputId": "8679f624-85a7-4ac0-9ae9-56702a8edfdc"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "libjpeg_turbo_equivalent_quality,elo,libjpeg_turbo_bitrate,mozjpeg_bitrate,jpegli_bitrate\n",
            "libjpeg-turbo-q70-yuv420,1685.1304931640625,1.1296766996383667,0.940491951974611,0.986600255931497\n",
            "libjpeg-turbo-q75-yuv420,1757.050537109375,1.2395873069763184,1.0206446804441114,1.0435789756588576\n",
            "libjpeg-turbo-q80-yuv422,1989.6468505859375,1.5401406288146973,1.3985910069922816,1.2060982872396786\n",
            "libjpeg-turbo-q85-yuv422,2150.5595703125,1.8047833442687988,1.6460170723784693,1.3902699242484242\n",
            "libjpeg-turbo-q90-yuv444,2392.5341796875,2.622631549835205,2.6262534131392052,1.8477547233536156\n",
            "libjpeg-turbo-q95-yuv444,2608.0166015625,3.774329900741577,3.5005639449528534,2.6738307925538596\n"
          ]
        }
      ],
      "source": [
        "data = dataframe.values\n",
        "methods = np.unique(data[:, -1])\n",
        "elos = {\n",
        "    method: data[data[:, -1] == method][:, 1].astype(np.float32)\n",
        "    for method in methods\n",
        "}\n",
        "bitrates = {\n",
        "    method: data[data[:, -1] == method][:, 4].astype(np.float32)\n",
        "    for method in methods\n",
        "}\n",
        "turbo_names = data[data[:, -1] == 'libjpeg-turbo'][:, 0]\n",
        "elos_to_compare = []\n",
        "turbo_equivalent_qualities = []\n",
        "for index, elo in enumerate(elos['libjpeg-turbo']):\n",
        "  if (\n",
        "      elo \u003e= min(elos['jpegli'])\n",
        "      and elo \u003e= min(elos['mozjpeg'])\n",
        "      and elo \u003c= max(elos['jpegli'])\n",
        "      and elo \u003c= max(elos['mozjpeg'])\n",
        "  ):\n",
        "    elos_to_compare.append(elo)\n",
        "    turbo_equivalent_qualities.append(turbo_names[index])\n",
        "\n",
        "\n",
        "def bitrate_at_elo(method, elo):\n",
        "  return np.interp(elo, elos[method], bitrates[method])\n",
        "\n",
        "\n",
        "def elo_at_bitrate(method, bitrate):\n",
        "  return np.interp(bitrate, bitrates[method], elos[method])\n",
        "\n",
        "\n",
        "print(\n",
        "    f'libjpeg_turbo_equivalent_quality,elo,libjpeg_turbo_bitrate,mozjpeg_bitrate,jpegli_bitrate'\n",
        ")\n",
        "for i in range(len(elos_to_compare)):\n",
        "  elo = elos_to_compare[i]\n",
        "  name = turbo_equivalent_qualities[i]\n",
        "  print(\n",
        "      f\"{name},{elo},{bitrate_at_elo('libjpeg-turbo', elo)},{bitrate_at_elo('mozjpeg', elo)},{bitrate_at_elo('jpegli', elo)}\"\n",
        "  )"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "executionInfo": {
          "elapsed": 8,
          "status": "ok",
          "timestamp": 1707225325228,
          "user": {
            "displayName": "Martin Bruse",
            "userId": "11653897382912197853"
          },
          "user_tz": -60
        },
        "id": "QR4hBQQUtNVu",
        "outputId": "fe8f268c-a961-477f-ae8b-a27f3880e0c8"
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "turbo_bitrate_at_elo_2_1=2237.9045500597854\n",
            "bitrate_at_elo(\"jpegli\", turbo_bitrate_at_elo_2_1)=1.5136595319075263\n"
          ]
        }
      ],
      "source": [
        "turbo_bitrate_at_elo_2_1 = elo_at_bitrate('libjpeg-turbo', 2.1)\n",
        "print(f'{turbo_bitrate_at_elo_2_1=}')\n",
        "print(f'{bitrate_at_elo(\"jpegli\", turbo_bitrate_at_elo_2_1)=}')"
      ]
    }
  ],
  "metadata": {
    "colab": {
      "last_runtime": {
        "build_target": "//learning/grp/tools/ml_python:ml_notebook",
        "kind": "private"
      },
      "provenance": [
        {
          "file_id": "17gbYbsEwG2G3n8gcVwOHdmv8vb6v_cqL",
          "timestamp": 1707225365477
        },
        {
          "file_id": "1hYb8c5oOumv1yVLbbscsrxBImaUyipyt",
          "timestamp": 1706791703210
        }
      ]
    },
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}
